package org.dome.websocket.websocket;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;

/**
 * ChatChannel类通过WebSocket提供聊天频道的终端。
 * 它处理客户端的打开、关闭、消息发送和错误处理。
 */
@Slf4j
@Component
@ServerEndpoint(value = "/chat")
public class ChatChannel {

    /**
     * 与客户端的WebSocket会话。
     * 用于发送和接收消息。
     */
    private Session session;

    /**
     * 当收到客户端消息时调用。
     * @param message 客户端发送的消息。
     */
    @OnMessage
    public void onMessage(String message) {
        log.info("接收到sessionId{}发来的消息：{}",session.getId(), message);
        sendMessage("服务器收到的信息：" + message);
    }

    /**
     * 当客户端连接打开时调用。
     * @param session 客户端的WebSocket会话。
     */
    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        log.info("sessionId{}连接成功", session.getId());
    }

    /**
     * 当发生错误时调用。
     * @param throwable 发生的异常。
     * @throws IOException 如果关闭会话时发生错误。
     */
    @OnError
    public void onError(Throwable throwable) throws IOException {
        log.error("sessionId{}发生错误：{}", session.getId(), throwable.getMessage());
        session.close(new CloseReason(CloseReason.CloseCodes.PROTOCOL_ERROR, "发生错误"));
    }

    /**
     * 当客户端连接关闭时调用。
     * @param closeReason 关闭原因。
     */
    @OnClose
    public void onClose(CloseReason closeReason) {
        log.info("sessionId{}连接关闭，原因：{}", session.getId(), closeReason.getReasonPhrase());
    }

    /**
     * 向客户端发送消息。
     * @param message 要发送的消息。
     */
    public void sendMessage(String message) {
        try {
            session.getBasicRemote().sendText(message);
        } catch (Exception e) {
            log.error("发送消息失败：{}", e.getMessage());
        }
    }

}

